#pragma once
#include <GL/glu.h>

namespace glu
{
#define FORWARD_TYPE(NAME, VAL)		using NAME = ::VAL
#define FORWARD_ENUM(NAME, VAL)		constexpr auto NAME = VAL
#define FORWARD_FUNC(NAME, VAL)		template <class ...ARGS> inline auto NAME (ARGS... args) { return VAL (args...); }

	// type
	FORWARD_TYPE(         nurbs_obj_t, GLUnurbsObj         );
	FORWARD_TYPE(       quadric_obj_t, GLUquadricObj       );
	FORWARD_TYPE(    tesselator_obj_t, GLUtesselatorObj    );
	FORWARD_TYPE(  triangulator_obj_t, GLUtriangulatorObj  );
	FORWARD_TYPE(             nurbs_t, GLUnurbs            );
	FORWARD_TYPE(           quadric_t, GLUquadric          );
	FORWARD_TYPE(        tesselator_t, GLUtesselator       );

	// enum
	FORWARD_ENUM(_auto_load_matrix                   , GLU_AUTO_LOAD_MATRIX                );
	FORWARD_ENUM(_begin                              , GLU_BEGIN                           );
	FORWARD_ENUM(_ccw                                , GLU_CCW                             );
	FORWARD_ENUM(_culling                            , GLU_CULLING                         );
	FORWARD_ENUM(_cw                                 , GLU_CW                              );
	FORWARD_ENUM(_display_mode                       , GLU_DISPLAY_MODE                    );
	FORWARD_ENUM(_domain_distance                    , GLU_DOMAIN_DISTANCE                 );
	FORWARD_ENUM(_edge_flag                          , GLU_EDGE_FLAG                       );
	FORWARD_ENUM(_end                                , GLU_END                             );
	FORWARD_ENUM(_error                              , GLU_ERROR                           );
	FORWARD_ENUM(_extensions                         , GLU_EXTENSIONS                      );
	FORWARD_ENUM(_exterior                           , GLU_EXTERIOR                        );
	FORWARD_ENUM(_false                              , GLU_FALSE                           );
	FORWARD_ENUM(_fill                               , GLU_FILL                            );
	FORWARD_ENUM(_flat                               , GLU_FLAT                            );
	FORWARD_ENUM(_incompatible_gl_version            , GLU_INCOMPATIBLE_GL_VERSION         );
	FORWARD_ENUM(_inside                             , GLU_INSIDE                          );
	FORWARD_ENUM(_interior                           , GLU_INTERIOR                        );
	FORWARD_ENUM(_invalid_enum                       , GLU_INVALID_ENUM                    );
	FORWARD_ENUM(_invalid_operation                  , GLU_INVALID_OPERATION               );
	FORWARD_ENUM(_invalid_value                      , GLU_INVALID_VALUE                   );
	FORWARD_ENUM(_line                               , GLU_LINE                            );
	FORWARD_ENUM(_map1_trim_2                        , GLU_MAP1_TRIM_2                     );
	FORWARD_ENUM(_map1_trim_3                        , GLU_MAP1_TRIM_3                     );
	FORWARD_ENUM(_none                               , GLU_NONE                            );
	FORWARD_ENUM(_nurbs_begin                        , GLU_NURBS_BEGIN                     );
	FORWARD_ENUM(_nurbs_begin_data                   , GLU_NURBS_BEGIN_DATA                );
	FORWARD_ENUM(_nurbs_begin_data_ext               , GLU_NURBS_BEGIN_DATA_EXT            );
	FORWARD_ENUM(_nurbs_begin_ext                    , GLU_NURBS_BEGIN_EXT                 );
	FORWARD_ENUM(_nurbs_color                        , GLU_NURBS_COLOR                     );
	FORWARD_ENUM(_nurbs_color_data                   , GLU_NURBS_COLOR_DATA                );
	FORWARD_ENUM(_nurbs_color_data_ext               , GLU_NURBS_COLOR_DATA_EXT            );
	FORWARD_ENUM(_nurbs_color_ext                    , GLU_NURBS_COLOR_EXT                 );
	FORWARD_ENUM(_nurbs_end                          , GLU_NURBS_END                       );
	FORWARD_ENUM(_nurbs_end_data                     , GLU_NURBS_END_DATA                  );
	FORWARD_ENUM(_nurbs_end_data_ext                 , GLU_NURBS_END_DATA_EXT              );
	FORWARD_ENUM(_nurbs_end_ext                      , GLU_NURBS_END_EXT                   );
	FORWARD_ENUM(_nurbs_error                        , GLU_NURBS_ERROR                     );
	FORWARD_ENUM(_nurbs_error10                      , GLU_NURBS_ERROR10                   );
	FORWARD_ENUM(_nurbs_error1                       , GLU_NURBS_ERROR1                    );
	FORWARD_ENUM(_nurbs_error11                      , GLU_NURBS_ERROR11                   );
	FORWARD_ENUM(_nurbs_error12                      , GLU_NURBS_ERROR12                   );
	FORWARD_ENUM(_nurbs_error13                      , GLU_NURBS_ERROR13                   );
	FORWARD_ENUM(_nurbs_error14                      , GLU_NURBS_ERROR14                   );
	FORWARD_ENUM(_nurbs_error15                      , GLU_NURBS_ERROR15                   );
	FORWARD_ENUM(_nurbs_error16                      , GLU_NURBS_ERROR16                   );
	FORWARD_ENUM(_nurbs_error17                      , GLU_NURBS_ERROR17                   );
	FORWARD_ENUM(_nurbs_error18                      , GLU_NURBS_ERROR18                   );
	FORWARD_ENUM(_nurbs_error19                      , GLU_NURBS_ERROR19                   );
	FORWARD_ENUM(_nurbs_error20                      , GLU_NURBS_ERROR20                   );
	FORWARD_ENUM(_nurbs_error2                       , GLU_NURBS_ERROR2                    );
	FORWARD_ENUM(_nurbs_error21                      , GLU_NURBS_ERROR21                   );
	FORWARD_ENUM(_nurbs_error22                      , GLU_NURBS_ERROR22                   );
	FORWARD_ENUM(_nurbs_error23                      , GLU_NURBS_ERROR23                   );
	FORWARD_ENUM(_nurbs_error24                      , GLU_NURBS_ERROR24                   );
	FORWARD_ENUM(_nurbs_error25                      , GLU_NURBS_ERROR25                   );
	FORWARD_ENUM(_nurbs_error26                      , GLU_NURBS_ERROR26                   );
	FORWARD_ENUM(_nurbs_error27                      , GLU_NURBS_ERROR27                   );
	FORWARD_ENUM(_nurbs_error28                      , GLU_NURBS_ERROR28                   );
	FORWARD_ENUM(_nurbs_error29                      , GLU_NURBS_ERROR29                   );
	FORWARD_ENUM(_nurbs_error30                      , GLU_NURBS_ERROR30                   );
	FORWARD_ENUM(_nurbs_error3                       , GLU_NURBS_ERROR3                    );
	FORWARD_ENUM(_nurbs_error31                      , GLU_NURBS_ERROR31                   );
	FORWARD_ENUM(_nurbs_error32                      , GLU_NURBS_ERROR32                   );
	FORWARD_ENUM(_nurbs_error33                      , GLU_NURBS_ERROR33                   );
	FORWARD_ENUM(_nurbs_error34                      , GLU_NURBS_ERROR34                   );
	FORWARD_ENUM(_nurbs_error35                      , GLU_NURBS_ERROR35                   );
	FORWARD_ENUM(_nurbs_error36                      , GLU_NURBS_ERROR36                   );
	FORWARD_ENUM(_nurbs_error37                      , GLU_NURBS_ERROR37                   );
	FORWARD_ENUM(_nurbs_error4                       , GLU_NURBS_ERROR4                    );
	FORWARD_ENUM(_nurbs_error5                       , GLU_NURBS_ERROR5                    );
	FORWARD_ENUM(_nurbs_error6                       , GLU_NURBS_ERROR6                    );
	FORWARD_ENUM(_nurbs_error7                       , GLU_NURBS_ERROR7                    );
	FORWARD_ENUM(_nurbs_error8                       , GLU_NURBS_ERROR8                    );
	FORWARD_ENUM(_nurbs_error9                       , GLU_NURBS_ERROR9                    );
	FORWARD_ENUM(_nurbs_mode                         , GLU_NURBS_MODE                      );
	FORWARD_ENUM(_nurbs_mode_ext                     , GLU_NURBS_MODE_EXT                  );
	FORWARD_ENUM(_nurbs_normal                       , GLU_NURBS_NORMAL                    );
	FORWARD_ENUM(_nurbs_normal_data                  , GLU_NURBS_NORMAL_DATA               );
	FORWARD_ENUM(_nurbs_normal_data_ext              , GLU_NURBS_NORMAL_DATA_EXT           );
	FORWARD_ENUM(_nurbs_normal_ext                   , GLU_NURBS_NORMAL_EXT                );
	FORWARD_ENUM(_nurbs_renderer                     , GLU_NURBS_RENDERER                  );
	FORWARD_ENUM(_nurbs_renderer_ext                 , GLU_NURBS_RENDERER_EXT              );
	FORWARD_ENUM(_nurbs_tessellator                  , GLU_NURBS_TESSELLATOR               );
	FORWARD_ENUM(_nurbs_tessellator_ext              , GLU_NURBS_TESSELLATOR_EXT           );
	FORWARD_ENUM(_nurbs_tex_coord_data_ext           , GLU_NURBS_TEX_COORD_DATA_EXT        );
	FORWARD_ENUM(_nurbs_tex_coord_ext                , GLU_NURBS_TEX_COORD_EXT             );
	FORWARD_ENUM(_nurbs_texture_coord                , GLU_NURBS_TEXTURE_COORD             );
	FORWARD_ENUM(_nurbs_texture_coord_data           , GLU_NURBS_TEXTURE_COORD_DATA        );
	FORWARD_ENUM(_nurbs_vertex                       , GLU_NURBS_VERTEX                    );
	FORWARD_ENUM(_nurbs_vertex_data                  , GLU_NURBS_VERTEX_DATA               );
	FORWARD_ENUM(_nurbs_vertex_data_ext              , GLU_NURBS_VERTEX_DATA_EXT           );
	FORWARD_ENUM(_nurbs_vertex_ext                   , GLU_NURBS_VERTEX_EXT                );
	FORWARD_ENUM(_object_parametric_error            , GLU_OBJECT_PARAMETRIC_ERROR         );
	FORWARD_ENUM(_object_parametric_error_ext        , GLU_OBJECT_PARAMETRIC_ERROR_EXT     );
	FORWARD_ENUM(_object_path_length                 , GLU_OBJECT_PATH_LENGTH              );
	FORWARD_ENUM(_object_path_length_ext             , GLU_OBJECT_PATH_LENGTH_EXT          );
	FORWARD_ENUM(_outline_patch                      , GLU_OUTLINE_PATCH                   );
	FORWARD_ENUM(_outline_polygon                    , GLU_OUTLINE_POLYGON                 );
	FORWARD_ENUM(_out_of_memory                      , GLU_OUT_OF_MEMORY                   );
	FORWARD_ENUM(_outside                            , GLU_OUTSIDE                         );
	FORWARD_ENUM(_parametric_error                   , GLU_PARAMETRIC_ERROR                );
	FORWARD_ENUM(_parametric_tolerance               , GLU_PARAMETRIC_TOLERANCE            );
	FORWARD_ENUM(_path_length                        , GLU_PATH_LENGTH                     );
	FORWARD_ENUM(_point                              , GLU_POINT                           );
	FORWARD_ENUM(_sampling_method                    , GLU_SAMPLING_METHOD                 );
	FORWARD_ENUM(_sampling_tolerance                 , GLU_SAMPLING_TOLERANCE              );
	FORWARD_ENUM(_silhouette                         , GLU_SILHOUETTE                      );
	FORWARD_ENUM(_smooth                             , GLU_SMOOTH                          );
	FORWARD_ENUM(_tess_begin                         , GLU_TESS_BEGIN                      );
	FORWARD_ENUM(_tess_begin_data                    , GLU_TESS_BEGIN_DATA                 );
	FORWARD_ENUM(_tess_boundary_only                 , GLU_TESS_BOUNDARY_ONLY              );
	FORWARD_ENUM(_tess_combine                       , GLU_TESS_COMBINE                    );
	FORWARD_ENUM(_tess_combine_data                  , GLU_TESS_COMBINE_DATA               );
	FORWARD_ENUM(_tess_coord_too_large               , GLU_TESS_COORD_TOO_LARGE            );
	FORWARD_ENUM(_tess_edge_flag                     , GLU_TESS_EDGE_FLAG                  );
	FORWARD_ENUM(_tess_edge_flag_data                , GLU_TESS_EDGE_FLAG_DATA             );
	FORWARD_ENUM(_tess_end                           , GLU_TESS_END                        );
	FORWARD_ENUM(_tess_end_data                      , GLU_TESS_END_DATA                   );
	FORWARD_ENUM(_tess_error                         , GLU_TESS_ERROR                      );
	FORWARD_ENUM(_tess_error1                        , GLU_TESS_ERROR1                     );
	FORWARD_ENUM(_tess_error2                        , GLU_TESS_ERROR2                     );
	FORWARD_ENUM(_tess_error3                        , GLU_TESS_ERROR3                     );
	FORWARD_ENUM(_tess_error4                        , GLU_TESS_ERROR4                     );
	FORWARD_ENUM(_tess_error5                        , GLU_TESS_ERROR5                     );
	FORWARD_ENUM(_tess_error6                        , GLU_TESS_ERROR6                     );
	FORWARD_ENUM(_tess_error7                        , GLU_TESS_ERROR7                     );
	FORWARD_ENUM(_tess_error8                        , GLU_TESS_ERROR8                     );
	FORWARD_ENUM(_tess_error_data                    , GLU_TESS_ERROR_DATA                 );
	FORWARD_ENUM(_tess_max_coord                     , GLU_TESS_MAX_COORD                  );
	FORWARD_ENUM(_tess_missing_begin_contour         , GLU_TESS_MISSING_BEGIN_CONTOUR      );
	FORWARD_ENUM(_tess_missing_begin_polygon         , GLU_TESS_MISSING_BEGIN_POLYGON      );
	FORWARD_ENUM(_tess_missing_end_contour           , GLU_TESS_MISSING_END_CONTOUR        );
	FORWARD_ENUM(_tess_missing_end_polygon           , GLU_TESS_MISSING_END_POLYGON        );
	FORWARD_ENUM(_tess_need_combine_callback         , GLU_TESS_NEED_COMBINE_CALLBACK      );
	FORWARD_ENUM(_tess_tolerance                     , GLU_TESS_TOLERANCE                  );
	FORWARD_ENUM(_tess_vertex                        , GLU_TESS_VERTEX                     );
	FORWARD_ENUM(_tess_vertex_data                   , GLU_TESS_VERTEX_DATA                );
	FORWARD_ENUM(_tess_winding_abs_geq_two           , GLU_TESS_WINDING_ABS_GEQ_TWO        );
	FORWARD_ENUM(_tess_winding_negative              , GLU_TESS_WINDING_NEGATIVE           );
	FORWARD_ENUM(_tess_winding_nonzero               , GLU_TESS_WINDING_NONZERO            );
	FORWARD_ENUM(_tess_winding_odd                   , GLU_TESS_WINDING_ODD                );
	FORWARD_ENUM(_tess_winding_positive              , GLU_TESS_WINDING_POSITIVE           );
	FORWARD_ENUM(_tess_winding_rule                  , GLU_TESS_WINDING_RULE               );
	FORWARD_ENUM(_true                               , GLU_TRUE                            );
	FORWARD_ENUM(_unknown                            , GLU_UNKNOWN                         );
	FORWARD_ENUM(_u_step                             , GLU_U_STEP                          );
	FORWARD_ENUM(_version                            , GLU_VERSION                         );
	FORWARD_ENUM(_version_1_1                        , GLU_VERSION_1_1                     );
	FORWARD_ENUM(_version_1_2                        , GLU_VERSION_1_2                     );
	FORWARD_ENUM(_version_1_3                        , GLU_VERSION_1_3                     );
	FORWARD_ENUM(_vertex                             , GLU_VERTEX                          );
	FORWARD_ENUM(_v_step                             , GLU_V_STEP                          );

	// function
	FORWARD_FUNC(error_string                , gluErrorString              );
	FORWARD_FUNC(get_string                  , gluGetString                );
	FORWARD_FUNC(check_extension             , gluCheckExtension           );
	FORWARD_FUNC(build_1dmipmap_levels       , gluBuild1DMipmapLevels      );
	FORWARD_FUNC(build_1dmipmaps             , gluBuild1DMipmaps           );
	FORWARD_FUNC(build_2dmipmap_levels       , gluBuild2DMipmapLevels      );
	FORWARD_FUNC(build_2dmipmaps             , gluBuild2DMipmaps           );
	FORWARD_FUNC(build_3dmipmap_levels       , gluBuild3DMipmapLevels      );
	FORWARD_FUNC(build_3dmipmaps             , gluBuild3DMipmaps           );
	FORWARD_FUNC(project                     , gluProject                  );
	FORWARD_FUNC(scale_image                 , gluScaleImage               );
	FORWARD_FUNC(un_project4                 , gluUnProject4               );
	FORWARD_FUNC(un_project                  , gluUnProject                );
	FORWARD_FUNC(new_nurbs_renderer          , gluNewNurbsRenderer         );
	FORWARD_FUNC(new_quadric                 , gluNewQuadric               );
	FORWARD_FUNC(new_tess                    , gluNewTess                  );
	FORWARD_FUNC(begin_curve                 , gluBeginCurve               );
	FORWARD_FUNC(begin_polygon               , gluBeginPolygon             );
	FORWARD_FUNC(begin_surface               , gluBeginSurface             );
	FORWARD_FUNC(begin_trim                  , gluBeginTrim                );
	FORWARD_FUNC(cylinder                    , gluCylinder                 );
	FORWARD_FUNC(delete_nurbs_renderer       , gluDeleteNurbsRenderer      );
	FORWARD_FUNC(delete_quadric              , gluDeleteQuadric            );
	FORWARD_FUNC(delete_tess                 , gluDeleteTess               );
	FORWARD_FUNC(disk                        , gluDisk                     );
	FORWARD_FUNC(end_curve                   , gluEndCurve                 );
	FORWARD_FUNC(end_polygon                 , gluEndPolygon               );
	FORWARD_FUNC(end_surface                 , gluEndSurface               );
	FORWARD_FUNC(end_trim                    , gluEndTrim                  );
	FORWARD_FUNC(get_nurbs_property          , gluGetNurbsProperty         );
	FORWARD_FUNC(get_tess_property           , gluGetTessProperty          );
	FORWARD_FUNC(load_sampling_matrices      , gluLoadSamplingMatrices     );
	FORWARD_FUNC(look_at                     , gluLookAt                   );
	FORWARD_FUNC(next_contour                , gluNextContour              );
	FORWARD_FUNC(nurbs_callback_data_ext     , gluNurbsCallbackDataEXT     );
	FORWARD_FUNC(nurbs_callback_data         , gluNurbsCallbackData        );
	FORWARD_FUNC(nurbs_callback              , gluNurbsCallback            );
	FORWARD_FUNC(nurbs_curve                 , gluNurbsCurve               );
	FORWARD_FUNC(nurbs_property              , gluNurbsProperty            );
	FORWARD_FUNC(nurbs_surface               , gluNurbsSurface             );
	FORWARD_FUNC(ortho_2d                    , gluOrtho2D                  );
	FORWARD_FUNC(partial_disk                , gluPartialDisk              );
	FORWARD_FUNC(perspective                 , gluPerspective              );
	FORWARD_FUNC(pick_matrix                 , gluPickMatrix               );
	FORWARD_FUNC(pwl_curve                   , gluPwlCurve                 );
	FORWARD_FUNC(quadric_callback            , gluQuadricCallback          );
	FORWARD_FUNC(quadric_draw_style          , gluQuadricDrawStyle         );
	FORWARD_FUNC(quadric_normals             , gluQuadricNormals           );
	FORWARD_FUNC(quadric_orientation         , gluQuadricOrientation       );
	FORWARD_FUNC(quadric_texture             , gluQuadricTexture           );
	FORWARD_FUNC(sphere                      , gluSphere                   );
	FORWARD_FUNC(tess_begin_contour          , gluTessBeginContour         );
	FORWARD_FUNC(tess_begin_polygon          , gluTessBeginPolygon         );
	FORWARD_FUNC(tess_callback               , gluTessCallback             );
	FORWARD_FUNC(tess_end_contour            , gluTessEndContour           );
	FORWARD_FUNC(tess_end_polygon            , gluTessEndPolygon           );
	FORWARD_FUNC(tess_normal                 , gluTessNormal               );
	FORWARD_FUNC(tess_property               , gluTessProperty             );
	FORWARD_FUNC(tess_vertex                 , gluTessVertex               );

#undef FORWARD_TYPE
#undef FORWARD_ENUM
#undef FORWARD_FUNC
}


// undef type
#define GLUnurbsObj          static_assert(false, "no such type");
#define GLUquadricObj        static_assert(false, "no such type");
#define GLUtesselatorObj     static_assert(false, "no such type");
#define GLUtriangulatorObj   static_assert(false, "no such type");
#define GLUnurbs             static_assert(false, "no such type");
#define GLUquadric           static_assert(false, "no such type");
#define GLUtesselator        static_assert(false, "no such type");

// undef enum
#undef GLU_AUTO_LOAD_MATRIX
#undef GLU_BEGIN
#undef GLU_CCW
#undef GLU_CULLING
#undef GLU_CW
#undef GLU_DISPLAY_MODE
#undef GLU_DOMAIN_DISTANCE
#undef GLU_EDGE_FLAG
#undef GLU_END
#undef GLU_ERROR
#undef GLU_EXTENSIONS
#undef GLU_EXTERIOR
#undef GLU_FALSE
#undef GLU_FILL
#undef GLU_FLAT
#undef GLU_INCOMPATIBLE_GL_VERSION
#undef GLU_INSIDE
#undef GLU_INTERIOR
#undef GLU_INVALID_ENUM
#undef GLU_INVALID_OPERATION
#undef GLU_INVALID_VALUE
#undef GLU_LINE
#undef GLU_MAP1_TRIM_2
#undef GLU_MAP1_TRIM_3
#undef GLU_NONE
#undef GLU_NURBS_BEGIN
#undef GLU_NURBS_BEGIN_DATA
#undef GLU_NURBS_BEGIN_DATA_EXT
#undef GLU_NURBS_BEGIN_EXT
#undef GLU_NURBS_COLOR
#undef GLU_NURBS_COLOR_DATA
#undef GLU_NURBS_COLOR_DATA_EXT
#undef GLU_NURBS_COLOR_EXT
#undef GLU_NURBS_END
#undef GLU_NURBS_END_DATA
#undef GLU_NURBS_END_DATA_EXT
#undef GLU_NURBS_END_EXT
#undef GLU_NURBS_ERROR
#undef GLU_NURBS_ERROR10
#undef GLU_NURBS_ERROR1
#undef GLU_NURBS_ERROR11
#undef GLU_NURBS_ERROR12
#undef GLU_NURBS_ERROR13
#undef GLU_NURBS_ERROR14
#undef GLU_NURBS_ERROR15
#undef GLU_NURBS_ERROR16
#undef GLU_NURBS_ERROR17
#undef GLU_NURBS_ERROR18
#undef GLU_NURBS_ERROR19
#undef GLU_NURBS_ERROR20
#undef GLU_NURBS_ERROR2
#undef GLU_NURBS_ERROR21
#undef GLU_NURBS_ERROR22
#undef GLU_NURBS_ERROR23
#undef GLU_NURBS_ERROR24
#undef GLU_NURBS_ERROR25
#undef GLU_NURBS_ERROR26
#undef GLU_NURBS_ERROR27
#undef GLU_NURBS_ERROR28
#undef GLU_NURBS_ERROR29
#undef GLU_NURBS_ERROR30
#undef GLU_NURBS_ERROR3
#undef GLU_NURBS_ERROR31
#undef GLU_NURBS_ERROR32
#undef GLU_NURBS_ERROR33
#undef GLU_NURBS_ERROR34
#undef GLU_NURBS_ERROR35
#undef GLU_NURBS_ERROR36
#undef GLU_NURBS_ERROR37
#undef GLU_NURBS_ERROR4
#undef GLU_NURBS_ERROR5
#undef GLU_NURBS_ERROR6
#undef GLU_NURBS_ERROR7
#undef GLU_NURBS_ERROR8
#undef GLU_NURBS_ERROR9
#undef GLU_NURBS_MODE
#undef GLU_NURBS_MODE_EXT
#undef GLU_NURBS_NORMAL
#undef GLU_NURBS_NORMAL_DATA
#undef GLU_NURBS_NORMAL_DATA_EXT
#undef GLU_NURBS_NORMAL_EXT
#undef GLU_NURBS_RENDERER
#undef GLU_NURBS_RENDERER_EXT
#undef GLU_NURBS_TESSELLATOR
#undef GLU_NURBS_TESSELLATOR_EXT
#undef GLU_NURBS_TEX_COORD_DATA_EXT
#undef GLU_NURBS_TEX_COORD_EXT
#undef GLU_NURBS_TEXTURE_COORD
#undef GLU_NURBS_TEXTURE_COORD_DATA
#undef GLU_NURBS_VERTEX
#undef GLU_NURBS_VERTEX_DATA
#undef GLU_NURBS_VERTEX_DATA_EXT
#undef GLU_NURBS_VERTEX_EXT
#undef GLU_OBJECT_PARAMETRIC_ERROR
#undef GLU_OBJECT_PARAMETRIC_ERROR_EXT
#undef GLU_OBJECT_PATH_LENGTH
#undef GLU_OBJECT_PATH_LENGTH_EXT
#undef GLU_OUTLINE_PATCH
#undef GLU_OUTLINE_POLYGON
#undef GLU_OUT_OF_MEMORY
#undef GLU_OUTSIDE
#undef GLU_PARAMETRIC_ERROR
#undef GLU_PARAMETRIC_TOLERANCE
#undef GLU_PATH_LENGTH
#undef GLU_POINT
#undef GLU_SAMPLING_METHOD
#undef GLU_SAMPLING_TOLERANCE
#undef GLU_SILHOUETTE
#undef GLU_SMOOTH
#undef GLU_TESS_BEGIN
#undef GLU_TESS_BEGIN_DATA
#undef GLU_TESS_BOUNDARY_ONLY
#undef GLU_TESS_COMBINE
#undef GLU_TESS_COMBINE_DATA
#undef GLU_TESS_COORD_TOO_LARGE
#undef GLU_TESS_EDGE_FLAG
#undef GLU_TESS_EDGE_FLAG_DATA
#undef GLU_TESS_END
#undef GLU_TESS_END_DATA
#undef GLU_TESS_ERROR
#undef GLU_TESS_ERROR1
#undef GLU_TESS_ERROR2
#undef GLU_TESS_ERROR3
#undef GLU_TESS_ERROR4
#undef GLU_TESS_ERROR5
#undef GLU_TESS_ERROR6
#undef GLU_TESS_ERROR7
#undef GLU_TESS_ERROR8
#undef GLU_TESS_ERROR_DATA
#undef GLU_TESS_MAX_COORD
#undef GLU_TESS_MISSING_BEGIN_CONTOUR
#undef GLU_TESS_MISSING_BEGIN_POLYGON
#undef GLU_TESS_MISSING_END_CONTOUR
#undef GLU_TESS_MISSING_END_POLYGON
#undef GLU_TESS_NEED_COMBINE_CALLBACK
#undef GLU_TESS_TOLERANCE
#undef GLU_TESS_VERTEX
#undef GLU_TESS_VERTEX_DATA
#undef GLU_TESS_WINDING_ABS_GEQ_TWO
#undef GLU_TESS_WINDING_NEGATIVE
#undef GLU_TESS_WINDING_NONZERO
#undef GLU_TESS_WINDING_ODD
#undef GLU_TESS_WINDING_POSITIVE
#undef GLU_TESS_WINDING_RULE
#undef GLU_TRUE
#undef GLU_UNKNOWN
#undef GLU_U_STEP
#undef GLU_VERSION
#undef GLU_VERSION_1_1
#undef GLU_VERSION_1_2
#undef GLU_VERSION_1_3
#undef GLU_VERTEX
#undef GLU_V_STEP

// undef function
#define gluErrorString(...)          static_assert(false, "no such function");
#define gluGetString(...)            static_assert(false, "no such function");
#define gluCheckExtension(...)       static_assert(false, "no such function");
#define gluBuild1DMipmapLevels(...)  static_assert(false, "no such function");
#define gluBuild1DMipmaps(...)       static_assert(false, "no such function");
#define gluBuild2DMipmapLevels(...)  static_assert(false, "no such function");
#define gluBuild2DMipmaps(...)       static_assert(false, "no such function");
#define gluBuild3DMipmapLevels(...)  static_assert(false, "no such function");
#define gluBuild3DMipmaps(...)       static_assert(false, "no such function");
#define gluProject(...)              static_assert(false, "no such function");
#define gluScaleImage(...)           static_assert(false, "no such function");
#define gluUnProject4(...)           static_assert(false, "no such function");
#define gluUnProject(...)            static_assert(false, "no such function");
#define gluNewNurbsRenderer(...)     static_assert(false, "no such function");
#define gluNewQuadric(...)           static_assert(false, "no such function");
#define gluNewTess(...)              static_assert(false, "no such function");
#define gluBeginCurve(...)           static_assert(false, "no such function");
#define gluBeginPolygon(...)         static_assert(false, "no such function");
#define gluBeginSurface(...)         static_assert(false, "no such function");
#define gluBeginTrim(...)            static_assert(false, "no such function");
#define gluCylinder(...)             static_assert(false, "no such function");
#define gluDeleteNurbsRenderer(...)  static_assert(false, "no such function");
#define gluDeleteQuadric(...)        static_assert(false, "no such function");
#define gluDeleteTess(...)           static_assert(false, "no such function");
#define gluDisk(...)                 static_assert(false, "no such function");
#define gluEndCurve(...)             static_assert(false, "no such function");
#define gluEndPolygon(...)           static_assert(false, "no such function");
#define gluEndSurface(...)           static_assert(false, "no such function");
#define gluEndTrim(...)              static_assert(false, "no such function");
#define gluGetNurbsProperty(...)     static_assert(false, "no such function");
#define gluGetTessProperty(...)      static_assert(false, "no such function");
#define gluLoadSamplingMatrices(...) static_assert(false, "no such function");
#define gluLookAt(...)               static_assert(false, "no such function");
#define gluNextContour(...)          static_assert(false, "no such function");
#define gluNurbsCallbackDataEXT(...) static_assert(false, "no such function");
#define gluNurbsCallbackData(...)    static_assert(false, "no such function");
#define gluNurbsCallback(...)        static_assert(false, "no such function");
#define gluNurbsCurve(...)           static_assert(false, "no such function");
#define gluNurbsProperty(...)        static_assert(false, "no such function");
#define gluNurbsSurface(...)         static_assert(false, "no such function");
#define gluOrtho2D(...)              static_assert(false, "no such function");
#define gluPartialDisk(...)          static_assert(false, "no such function");
#define gluPerspective(...)          static_assert(false, "no such function");
#define gluPickMatrix(...)           static_assert(false, "no such function");
#define gluPwlCurve(...)             static_assert(false, "no such function");
#define gluQuadricCallback(...)      static_assert(false, "no such function");
#define gluQuadricDrawStyle(...)     static_assert(false, "no such function");
#define gluQuadricNormals(...)       static_assert(false, "no such function");
#define gluQuadricOrientation(...)   static_assert(false, "no such function");
#define gluQuadricTexture(...)       static_assert(false, "no such function");
#define gluSphere(...)               static_assert(false, "no such function");
#define gluTessBeginContour(...)     static_assert(false, "no such function");
#define gluTessBeginPolygon(...)     static_assert(false, "no such function");
#define gluTessCallback(...)         static_assert(false, "no such function");
#define gluTessEndContour(...)       static_assert(false, "no such function");
#define gluTessEndPolygon(...)       static_assert(false, "no such function");
#define gluTessNormal(...)           static_assert(false, "no such function");
#define gluTessProperty(...)         static_assert(false, "no such function");
#define gluTessVertex(...)           static_assert(false, "no such function");

